package com.UnionPayCenter.util;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.util.ClassUtils;

import java.io.*;
import java.util.*;

public class CSVUtil {
	@SuppressWarnings("rawtypes")
	public static File createCSVFile(List exportData, Map titlemap, String outPutPath, String filename) {

		File csvFile = null;
		BufferedWriter csvFileOutputStream = null;
		try {
			csvFile = new File(outPutPath + filename + ".xls");
			// csvFile.getParentFile().mkdir();
			File parent = csvFile.getParentFile();
			if (parent != null && !parent.exists()) {
				parent.mkdirs();
			}
			csvFile.createNewFile();

			// GB2312使正确读取分隔符","
			csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "gbk"), 1024);
			// 写入文件头部
			for (Iterator propertyIterator = titlemap.entrySet().iterator(); propertyIterator.hasNext();) {
				Map.Entry propertyEntry = (Map.Entry) propertyIterator.next();
				csvFileOutputStream.write(propertyEntry.getValue().toString());
				if (propertyIterator.hasNext()) {
					csvFileOutputStream.write(",");
				}
			}
			csvFileOutputStream.newLine();

			// 写入文件内容
			for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
				// Object row = (Object) iterator.next();
				LinkedHashMap row = (LinkedHashMap) iterator.next();
				//System.out.println(row);

				for (Iterator propertyIterator = row.entrySet().iterator(); propertyIterator.hasNext();) {
					Map.Entry propertyEntry = (Map.Entry) propertyIterator.next();
					// System.out.println( BeanUtils.getProperty(row, propertyEntry.getKey().toString()));
					csvFileOutputStream.write( propertyEntry.getValue().toString());
					if (propertyIterator.hasNext()) {
						csvFileOutputStream.write(",");
					}
				}
				if (iterator.hasNext()) {
					csvFileOutputStream.newLine();
				}
			}
			csvFileOutputStream.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(null != csvFileOutputStream)
					csvFileOutputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return csvFile;
	}

	public static void poiExcel(String name, String title, String[] propertyName, List<List<String>> exportData)
			throws FileNotFoundException, IOException {
		// 创建一个Excel文件
		HSSFWorkbook wb = new HSSFWorkbook();
		// 创建一个Excel的Sheet
		HSSFSheet sheet = wb.createSheet("first sheet");
		// 获取表需要的列数
		int length = propertyName.length;
		// ---------------下面设置表的第一行也就是通常的title----------------------
		// 设置行-下面为第一行
		HSSFRow row0 = sheet.createRow(0);
		// 设置列-下面为第一行的第一列
		HSSFCell cell00 = row0.createCell(0);
		// 设置字体
		HSSFFont headfont = wb.createFont();
		headfont.setFontName("黑体");
		// 字体大小
		headfont.setFontHeightInPoints((short) 22);
		// 加粗
		headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 设置样式
		HSSFCellStyle headstyle = wb.createCellStyle();
		// 使用了上面设置的字体样式
		headstyle.setFont(headfont);
		// 左右居中
		headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 上下居中
		headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headstyle.setLocked(true);
		// 自动换行
		headstyle.setWrapText(true);
		// 合并单元格：参数说明：1：开始行 2：结束行 3：开始列 4：结束列
		// 注意,在这里使用表字段名-1来作结束列,因为我们是从0开始数的,所以要减去一个
		CellRangeAddress range = new CellRangeAddress(0, 0, 0, length - 1);
		// 将表的合并单元格样式设置进去
		sheet.addMergedRegion(range);
		// 设置表的第一行的第一列的样式
		cell00.setCellStyle(headstyle);
		// 设置表的第一行的第一列的value
		cell00.setCellValue(title);
		row0.setHeight((short) 750);
		// ---------------下面开始设置表的第二行,通常为字段名----------------------
		HSSFRow row1 = sheet.createRow(1);
		// 字段名使用的字体
		HSSFFont columnHeadFont = wb.createFont();
		columnHeadFont.setFontName("宋体");
		// 字体大小
		columnHeadFont.setFontHeightInPoints((short) 10);
		// 加粗
		columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 列头的样式
		HSSFCellStyle columnHeadStyle = wb.createCellStyle();
		// 设置上面已经设置好的字体样式
		columnHeadStyle.setFont(columnHeadFont);
		// 左右居中
		columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 上下居中
		columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		columnHeadStyle.setLocked(true);
		columnHeadStyle.setWrapText(true);
		// 上边框的颜色
		columnHeadStyle.setTopBorderColor(HSSFColor.BLACK.index);
		// 边框的大小
		columnHeadStyle.setBorderTop((short) 1);
		// 左边框的颜色
		columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
		// 边框的大小
		columnHeadStyle.setBorderLeft((short) 1);
		// 右边框的颜色
		columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
		// 边框的大小
		columnHeadStyle.setBorderRight((short) 1);
		// 设置单元格的边框为粗体
		columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// 设置单元格的边框颜色
		columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
		// 设置单元格的背景颜色（单元格的样式会覆盖列或行的样式）
		columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		// 设置第二行的行高
		row1.setHeight((short) 750);
		// 创建在这行中的列
		HSSFCell cell1 = null;
		for (int i = 0; i < length; i++) {
			cell1 = row1.createCell(i);
			// 获取数组中的表头字段名
			cell1.setCellValue(propertyName[i]);
			// 给它设置风格
			cell1.setCellStyle(columnHeadStyle);
		}

		// ---------------下面开始设置表里面的内容-----------------------------
		// 设置字体
		HSSFFont font = wb.createFont();
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) 10);
		// 设置其风格
		HSSFCellStyle style = wb.createCellStyle();
		style.setFont(font);
		// 左右居中
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 上下居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		style.setWrapText(true);
		style.setLeftBorderColor(HSSFColor.BLACK.index);
		style.setBorderLeft((short) 1);
		style.setRightBorderColor(HSSFColor.BLACK.index);
		style.setBorderRight((short) 1);
		// 设置单元格的边框为粗体
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// 设置单元格的边框颜色．
		style.setBottomBorderColor(HSSFColor.BLACK.index);
		// 设置单元格的背景颜色．
		style.setFillForegroundColor(HSSFColor.WHITE.index);
		HSSFRow row = null;
		HSSFCell cell = null;
		int valueStartRow = 2;

		for (List<String> list:exportData ) {
			row = sheet.createRow(valueStartRow);
			for (int i = 0; i < list.size(); i++) {
				cell = row.createCell(i);
				cell.setCellValue(list.get(i));
				cell.setCellStyle(style);
			}
			valueStartRow++;
		}

		String path = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"/static" + name;
		wb.write(new FileOutputStream(path));
	}

}
